/**
 * 测试参数对象是否是纯粹的对象(通过"{}"或者"new Object"创建的);
 * 参数obj--{Object}: 用于测试是否为纯粹的对象。
 */
var toString = Object.prototype.toString;

function isPlainObject(obj) {
	var hasOwn = Object.prototype.hasOwnProperty;
	// !obj ---一定要是对象
	// toString.call(obj) !== "[object Object]"----因为IE，检测constructor
	// obj.nodeType ----避免不是DOM nodes
	// obj.setInterval ---排除window
	if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
		return false;
	}
	// 是否是new fun()自定义对象
	// constructor是否是继承原型链
	// 原型链是否有isPrototypeOf
	if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
		return false;
	}
	// 判断是否有继承关系
	// 自己的属性会被首先遍历
	var key;
	for (key in obj) {}
	// 直接看最后一项是未了加速遍历的过程
	return key === undefined || hasOwn.call(obj, key);
};
log(isPlainObject({}));
log(isPlainObject(""));
log(isPlainObject(new Object()));
log(toString.call(""));